import 'dart:io';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:aio/aio.dart';
import 'package:myapp/src/route/route_helper.dart';
import 'package:myapp/src/services/floating_window_service.dart' as ai_service;
import 'package:myapp/src/utils/app_baidu_map_utils.dart';
import 'package:myapp/src/widgets/floating_ball.dart' as ai_ball;
import 'package:myapp/src/widgets/floating_window_content.dart';
import 'generated/app_strings.dart';
import 'package:flutter_overlay_window/flutter_overlay_window.dart';
import 'package:sdk_plugin/sdk_plugin.dart' as sdk;

// overlay entry point
@pragma("vm:entry-point")
void overlayMain() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(MaterialApp(
    color: Colors.transparent,
    //防止悬浮球背景色不透明。
    localizationsDelegates: AppStrings.localizationsDelegates(),
    supportedLocales: AppStrings.supportedLocales(),
    debugShowCheckedModeBanner: false,
    home: Builder(builder: (context) {
      return Material(
        child: ai_ball.FloatingBall(), //悬浮球组件
        color: Colors.transparent,
      );
    }),
  ));
}

void main() async {
  print('应用启动');
  WidgetsFlutterBinding.ensureInitialized();

  print('启动后台服务');
  // delayed(3, () async {
  //   // 启动后台服务
  //   await ai_service.FloatingWindowService.startBackgroundService();
  //
  //   // 监听悬浮窗返回信号
  //   print('设置悬浮窗监听器');
  //   FlutterOverlayWindow.overlayListener.listen((event) {
  //     print('收到悬浮窗事件: $event');
  //     if (event == "launch_app") {
  //       print("收到启动应用信号");
  //       try {
  //         // 使用 Intent 启动应用
  //         const platform = MethodChannel('com.example.myapp/launcher');
  //         platform.invokeMethod('launchApp').then((_) {
  //           print("应用启动成功");
  //         }).catchError((error) {
  //           print("启动应用时出错: $error");
  //         });
  //       } catch (e) {
  //         print("启动应用时出错: $e");
  //       }
  //     }
  //   }, onError: (error) {
  //     print('悬浮窗监听器错误: $error');
  //   }, onDone: () {
  //     print('悬浮窗监听器完成');
  //   });
  // });
  print('运行应用');
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  String _platformVersion = 'Unknown';
  final _aioPlugin = Aio();

  @override
  void initState() {
    super.initState();
    initPlatformState();
    // 检查悬浮窗权限
    FloatingWindowService.requestPermission(context);
    //应用初始化的时候，强制关闭，状态恢复一下。防止异常。
    ai_service.FloatingWindowService.closeFloatingWindow(isForce: true);
    // 添加生命周期监听
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    // 移除生命周期监听
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  //fixme 注意，这个上下文，一定要在build(BuildContext context)里赋值。
  //统一上下文，方便在didChangeAppLifecycleState()方法里引用。
  BuildContext? _buildContext = null;

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    // switch (state) {
    //   case AppLifecycleState.resumed:
    //     // 应用在前台，隐藏悬浮球
    //     ai_service.FloatingWindowService.closeFloatingWindow();
    //     break;
    //   case AppLifecycleState.inactive:
    //   case AppLifecycleState.paused:
    //   case AppLifecycleState.detached:
    //     // 应用在后台，显示悬浮球
    //     AppUtils.getPackageInfo()?.then((value) {
    //       var appName = value?.appName ?? ""; //应用名称。
    //       //fixme 注意，这里要使用_buildContext，统一上下文。不要之间使用全局的context。不然AppStrings.of(context),报错。
    //       var context = _buildContext;
    //       if (context != null) {
    //         //print("======================应用名称：$appName");
    //         //print("======================appTitle：${AppStrings.of(context).appTitle}");
    //         var floatingWindowTitle = AppStrings.of(context)
    //             .floatingWindowTitle(appName); //app名称-正在运行中
    //         var floatingWindowBody =
    //             AppStrings.of(context).floatingWindowBody; //请不要关闭，以免影响您的推送功能
    //         ai_service.FloatingWindowService.showFloatingWindow(
    //             context, floatingWindowTitle, floatingWindowBody);
    //       }
    //     });
    //     break;
    //   default:
    //     break;
    // }
  }

  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      platformVersion =
          await _aioPlugin.getPlatformVersion() ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }
    if (!mounted) return;
    setState(() {
      _platformVersion = platformVersion;
    });
  }

  sdk.BaiduMapLocation? location;
  var AdressValue = ""; //位置
  @override
  Widget build(BuildContext context) {
    var materialApp = MaterialApp(
      //localizationsDelegates语言国际化配置
      localizationsDelegates: [
        ...AppStrings.localizationsDelegates(),
      ],
      supportedLocales: AppStrings.supportedLocales(),
      //fixme supportedLocales 支持的语言，必不可少，不然只会显示英文，不会显示中文。
      localeListResolutionCallback: (locales, supportedLocales) {
        // 当前语言：[zh_CN]	支持配置的语言：[en, zh_CN]
        print("当前语言：$locales\t支持配置的语言：$supportedLocales");
        return;
      },
      //debugShowCheckedModeBanner fixme true 显示Debug标签；false去除Debug标签。
      debugShowCheckedModeBanner: false,
      //解决桌面应用不能通过鼠标拖动的方式来滚动列表的问题。
      scrollBehavior: ScrollBehaviorUtils.getScrollBehavior(),
      home: Builder(builder: (context) {
        _buildContext = context;
        var material = Material(
          //fixme 这里用Builder();是为了获取MaterialApp里的BuildContext上下文。不然很多功能都会异常。对上下文有要求。
          child: Builder(builder: (context) {
            return Scaffold(
              appBar: AppBar(
                title: const Text("Plugin example app"),
              ),
              body: Center(
                child: ListView(
                  children: _children(context),
                ),
              ),
            );
          }),
        );
        return LibUi.listenerPopScope(context, material, () {},
            isIntercept: false);
      }),
    );
    return materialApp;
  }

  List<Widget> children = [];
  DateTime? _dateTime = null;
  DSharedPreferences? _pref;

  List<Widget> _children(BuildContext context) {
    print("================_children开始刷新");
    px.init(context);
    children?.clear(); //fixme 清除之前的就组件，但是仍然会导致组件缓存，不刷新的问题。必须新建才行。
    children = []; //fixme 防止组件有缓存，必须必须新建。不然组件不会刷新，亲测。
    children.add(Center(
      child: Text("平台版本信息：$_platformVersion"),
    ));
    children.add(LibUi.addItemline("应用重启", () {
      AioPlugin.restartApp(context);
    }));
    children.add(LibUi.addItemline("判断悬浮窗权限", () {
      ai_service.FloatingWindowService.checkPermission()?.then((value) {
        // print("悬浮窗权限L:$value");
        if (value) {
          //有权限，显示悬浮窗
          AppUtils.getPackageInfo()?.then((value) {
            var appName = value?.appName; //应用名称。
            var floatingWindowTitle = AppStrings.of(context)
                .floatingWindowTitle(appName ?? ""); //app名称-正在运行中
            var floatingWindowBody =
                AppStrings.of(context).floatingWindowBody; //请不要关闭，以免影响您的推送功能
            ai_service.FloatingWindowService.showFloatingWindow(
                context, floatingWindowTitle, floatingWindowBody);
          });
        } else {
          //没有权限，请求权限
          FloatingWindowService.requestPermission(context);
        }
      });
    }));
    children.add(LibUi.addItemline("申请悬浮窗权限", () {
      ai_service.FloatingWindowService.requestPermission(context);
    }));
    children.add(LibUi.addItemline("显示悬浮窗", () {
      // ai_service.FloatingWindowService.showFloatingWindow(context);
      AppUtils.getPackageInfo()?.then((value) {
        var appName = value?.appName; //应用名称。
        var floatingWindowTitle = AppStrings.of(context)
            .floatingWindowTitle(appName ?? ""); //app名称-正在运行中
        var floatingWindowBody =
            AppStrings.of(context).floatingWindowBody; //请不要关闭，以免影响您的推送功能
        ai_service.FloatingWindowService.showFloatingWindow(
            context, floatingWindowTitle, floatingWindowBody);
      });
    }));
    children.add(LibUi.addItemline("驾考宝典", () {
      AppRouteHelper.goDrvingTestRoute(context);
    }));
    children.add(LibUi.addItemline("小游戏界面跳转", () {
      AppRouteHelper.goGame(context);
    }));
    children.add(LibUi.addItemline("公寓游戏", () {
      AppRouteHelper.goApartmentGame(context);
    }));
    children.add(LibUi.addItemline("Ai界面跳转", () {
      AppRouteHelper.goAi(context);
    }));
    children.add(LibUi.addItemline("小区管理", () {
      AppRouteHelper.goCommunityPage(context);
    }));
    children.add(LibUi.addItemline(
        "开始定位位置\t${AdressValue ?? ""}\n${location ?? ""}", () {
      AppBaiduMapUtils.startLocation(context, (value) {
        setState(() {
          AdressValue = value?.address ?? "";
          location = value;
          print("百度定位回调位置：$AdressValue");
        });
      });
    }));
    children.add(LibUi.addItemline("停止位置", () {
      AppBaiduMapUtils.stopLocation(context);
    }));
    children.add(LibUi.addItemline("距离", () {
      // AioPlugin.goMap(context, endLatitude, endLongitude, endName)
    }));
    children.add(LibUi.addItemline("百度一下", () {
      // var initialUrl = "https://www.baidu.com/";
      // var initialUrl = "https://m.baidu.com/?from=1012852z";
      var initialUrl = "https://m.baidu.com/";
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("其他", () {
      var initialUrl =
          "https://gamefile.fp.ps.netease.com/file/67234272c8daa639635e27b4YO9aTWSG05?s=YWN0PWZ4fHRva2VuPWVhYjM4ZjA1Y2E1NTI4YmZmNGJlNTBlNTZhMGE2OGIzfHZpZD0xNzMwNDcwNDU2&s_key=61d66a8b75b6a845ea9064b5a7a984ed&wxtoken=1730470487";
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("其他2", () {
      var initialUrl =
          "https://img2.kaoshixing.com/ksx_prod/600701/database/29991159/20241106074409/643797946316.xml?755580&s=YWN0PWxpc3R8dG9rZW49ZWFiMzhmMDVjYTU1MjhiZmY0YmU1MGU1NmEwYTY4YjN8aWQ9MTcyOTA4OTIyNg%3D%3D&s_key=1b30720e81140eb04c09cd03e8184662&wxtoken=1730620907";
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("俄罗斯最大破解网站 https://byruthub.org/", () {
      var initialUrl = "https://byruthub.org/";
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("steam", () {
      var initialUrl = "https://store.steampowered.com/";
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline(
        "NR游戏nryx.net(NR 账号密码都是qaz01233,网址打不开了，估计跑路了，qq群都解散了，NR游戏，爱少女游戏)", () {
      //var initialUrl = "http://nryxe.com/";
      var initialUrl = "https://www.nryx.net/";
      // var initialUrl = "https://www.nrgame.net";
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("NR游戏nrgame 【新域名发布入口】", () {
      //var initialUrl = "http://nryxe.com/";
      // var initialUrl = "https://www.nryx.net/";
      var initialUrl = "https://www.nrgame.net";
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("NR游戏 一站：https://www.nrnryx.com/", () {
      //账号密码都是qaz01233
      TextUtils.copyText("qaz01233");
      //var initialUrl = "https://www.nnnrrr.xyz/";
      var initialUrl = "https://www.nrnryx.com/";
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("NR游戏 二站：https://www.nracg.net/", () {
      //账号密码都是qaz01233
      TextUtils.copyText("qaz01233");
      //var initialUrl = "https://www.nracg.net/";
      var initialUrl = "https://www.nnnnrrrr.com/";
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("NR游戏nryx.pro/yl (打不开了)", () {
      //var initialUrl = "http://nryxe.com/";
      // var initialUrl = "https://www.nryx.net/";
      var initialUrl = "https://www.nryx.pro/yl";
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("NR游戏nryx.pro 【新域名发布入口】", () {
      //var initialUrl = "http://nryxe.com/";
      // var initialUrl = "https://www.nryx.net/";
      var initialUrl = "https://www.nryx.pro/";
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("NR游戏nrfabu.com 【新域名发布入口】", () {
      var initialUrl = "https://www.nrfabu.com";
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("https://www.2cyshare.com/?cate=1", () {
      var initialUrl = 'https://www.2cyshare.com/?cate=1';
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("小象单机", () {
      var initialUrl = 'https://www.dxdjyx.com/';
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("土豆WebView", () {
      TextUtils.copyText("kYmIRKZ2SE36gTOESKkH"); //复制密钥
      var initialUrl = 'https://tdtd.vip/index';
      LibRouteHelper.goTudouWebViewRoute(context, initialUrl: initialUrl)
          ?.then((value) {
        if (_dateTime != null) {
          var _now = DateTime.now();
          var _d = _now.difference(_dateTime!);
          //当前时间，大于上次签到时间24小时，说明签到时间没有更新，提示更新。
          if (_d.inHours >= 24) {
            showDialogWithAlert(context, content: "是否更新签到时间?")?.then((value) {
              if (value != null && value) {
                setState?.call(() {
                  _dateTime = DateTime.now();
                  _pref?.setString("_dateTime", _dateTime.toString());
                });
              }
            });
          }
        }
      });
    }));
    var _state = StatefulBuilder(
      builder: (context, setState) {
        if (_dateTime == null) {
          //0 1 300s
          //100 2 150s
          //200 3 100s
          //300 4 75s
          //400 5 60s
          ///劈棍，立棍，戳棍，棍花
          SharedPreferences.getInstance()?.then((value) {
            _pref = DSharedPreferences(prefs: value);
            String? _str = _pref?.get("_dateTime")?.toString();
            if (StringUtils.isNotEmpty(_str)) {
              setState?.call(() {
                _dateTime = DateTimeUtils.stringToDateTime(_str!);
              });
            }
          });
        }
        return LibUi.addItemline("签到时间：${_dateTime?.toString()}", () {
          showDialogWithAlert(context, content: "是否更新签到时间?")?.then((value) {
            if (value != null && value) {
              setState?.call(() {
                ///加上弹窗确认，防止误触。
                _dateTime = DateTime.now();
                _pref?.setString("_dateTime", _dateTime.toString());
              });
            }
          });
        });
      },
    );
    children.add(Center(
      child: _state,
    ));
    children
        .add(LibUi.addItemline("(账号密码都是qaz01233)https://www.5dmcity.shop/", () {
      // var initialUrl = 'https://www.5dmcity.shop/';
      var initialUrl = 'https://www.5dmcitygame.com/';
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("https://xc8game.top/", () {
      var initialUrl = 'https://xc8game.top/';
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("acgfbt", () {
      var initialUrl = 'https://www.acgfbt.com/28048.html';
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("ACGSM", () {
      var initialUrl = 'https://www.ACGSM.com';
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("电子魅魔", () {
      var initialUrl =
          'https://www.sexyai.top/#/pages/index/index?inviteCode=qvqTb';
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    children.add(LibUi.addItemline("哔哩轻小说", () {
      //电脑端域名：linovelib.com
      //移动端域名：bilinovel.com
      var initialUrl = 'https://www.linovelib.com/top.html';
      if (PlatformUtils.isWindows()) {
        initialUrl = 'https://www.linovelib.com';
      } else {
        initialUrl = 'https://www.bilinovel.com';
      }
      LibRouteHelper.goWebViewRoute(context, initialUrl: initialUrl);
    }));
    return children;
  }
}
